/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package th.manager;

import com.google.inject.Inject;
import com.google.inject.Provider;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.StatelessSession;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import th.dao.PenggunaDAO;
import th.model.InfoAudit;
import th.model.Pengguna;
import th.model.SejarahPengguna;

/**
 *
 * @author fikri
 */
public class DeactivateUserManager {

    @Inject
    Provider<SessionFactory> sp;
    @Inject
    PenggunaDAO penggunaDAO;
    private static Logger LOG = (Logger) LoggerFactory.getLogger(DeactivateUserManager.class);

    public List<Pengguna> getInactiveList() {
        StatelessSession ss = null;

        try {
            Calendar cal = Calendar.getInstance();
            cal.add(Calendar.MONTH, -6);

            ss = sp.get().openStatelessSession();
            Criteria query = ss.createCriteria(Pengguna.class)
                    .add(Restrictions.eq("active", 'Y'))
                    .add(Restrictions.le("tarikhAkhirLogin", cal.getTime()));
            return query.list();
//            return ss.createQuery("Select p from Pengguna p where p.tarikhAkhirLogin <= :date and p.active = 'Y'").setParameter("date", cal.getTime()).list();

        } catch (HibernateException ex) {
            LOG.error(null, ex);
        } finally {
            if (ss != null) {
                ss.close();
            }
        }

        return Collections.EMPTY_LIST;
    }

    public List<Pengguna> getDeactiveList() {
        StatelessSession ss = null;

        try {
            Calendar cal = Calendar.getInstance();
            cal.add(Calendar.MONTH, -12);

            ss = sp.get().openStatelessSession();
//            Criteria query = ss.createCriteria(Pengguna.class)
//                    .add(Restrictions.eq("active", 'N'))
//                    .add(Restrictions.le("tarikhAkhirLogin", cal.getTime()));
//            return query.list();
            return ss.createQuery("Select p from Pengguna p where p.tarikhAkhirLogin <= :date and p.active = 'N'").setParameter("date", cal.getTime()).list();

        } catch (HibernateException ex) {
            LOG.error(null, ex);
        } finally {
            if (ss != null) {
                ss.close();
            }
        }

        return Collections.EMPTY_LIST;
    }

    public void inActivateUser(List<Pengguna> pengguna) {
        Session ss = null;
        Transaction tx = null;
        try {
            ss = sp.get().openSession();
            tx = ss.beginTransaction();
            for (Pengguna p : pengguna) {
                Criteria query = ss.createCriteria(Pengguna.class)
                        .add(Restrictions.eq("idPengguna", p.getIdPengguna()));
                Pengguna pguna = (Pengguna) query.uniqueResult();
                pguna.setActive('N');
                ss.update(pguna);
            }
            tx.commit();
        } catch (HibernateException ex) {
            tx.rollback();
            LOG.error(null, ex);
        } finally {
            if (ss != null) {
                ss.close();
            }
        }
    }

    public void inActivateUser(Pengguna pengguna) {
        StatelessSession ss = null;
        Transaction tx = null;
        try {
            ss = sp.get().openStatelessSession();
            tx = ss.beginTransaction();
//            Criteria query = ss.createCriteria(Pengguna.class)
//                        .add(Restrictions.eq("idPengguna", pengguna.getIdPengguna()));
//                Pengguna pguna = (Pengguna) query.uniqueResult();
            pengguna.setActive('N');             
            ss.update(pengguna);
            tx.commit();
        } catch (HibernateException ex) {
            tx.rollback();
            LOG.error(null, ex);
        } finally {
            if (ss != null) {
                ss.close();
            }
        }
    }

    public void deActivateUser(List<Pengguna> pengguna) {
        StatelessSession ss = null;
        Transaction tx = null;
        try {
            ss = sp.get().openStatelessSession();
            tx = ss.beginTransaction();
            for (Pengguna p : pengguna) {
                SejarahPengguna sejPengguna = new SejarahPengguna();
                sejPengguna.setCatatan("DEACTIVATE");
                sejPengguna.setIdPguna(p.getIdPengguna());
                sejPengguna.setNoKp(p.getNoKp());
                InfoAudit ia = new InfoAudit();
                Criteria query = ss.createCriteria(Pengguna.class)
                        .add(Restrictions.eq("idPengguna", "admin"));
                Pengguna pguna = (Pengguna) query.uniqueResult();
                ia.setTarikhMasuk(new Date());
                ia.setDimasukOleh(pguna);
                sejPengguna.setInfoAudit(ia);
                ss.insert(sejPengguna);
                ss.delete(p);
            }
            tx.commit();
        } catch (HibernateException ex) {
            tx.rollback();
            LOG.error(null, ex);
        } finally {
            if (ss != null) {
                ss.close();
            }
        }
    }
}
